var app = require('express')();
var http = require('http');

app.set('port',process.env.PORT || 3000);

app.use(function(req,res,next){
  console.log('Allways');
  next();
});

app.use(function(req,res,next){
  var cluster = require('cluster');
  if(cluster.isWorker) console.log('Worker %d received request',
    cluster.worker.id);
  next();
});

app.get('/a',function(req,res){
  console.log('/a:路由终止');
  res.send('a');
});

app.get('/a',function(req,res){
  console.log('/a:永远不会调用');
});

app.get('/b',function(req,res,next){
  console.log('/b:路由未终止');
  next();
});

app.use(function(req,res,next){
  console.log('SOMETIMES');
  next();
});

app.get('/b',function(req,res,next){
  console.log('/b(part2):抛出错误');
  throw new Error('b 失败');
});

app.use('/b',function(err,req,res,next){
  console.log('/b:检测到错误并传递');
  next(err);
});

app.get('/c',function(err,req){
  console.log('/c:抛出错误');
  throw new Error('c 失败');
});

app.use('/c',function(err,req,res,next){
  console.log('/c:检测到错误但不传递');
  next();
});

app.get('/epic-fail',function(req,res){
  process.nextTick(function(){
    throw new Error('Kaboom!');
  });
});

app.use(function(req,res,next){
  //为这个请求创建一个域
  var domain = require('domain').create();
  //处理这个域中的错误
  domain.on('error',function(err){
    console.error('DOMAIN ERROR CAUGHT\n',err.stack);
  });
  try{
    //在5秒内进行故障保护关机
    setTimeout(function(){
      console.error('Failsafe shutdown.');
      process.exit(1);
    },5000);
    var worker = require('cluster').worker;
    if(worker) worker.disconnect();

    server.close();

    try{
      //尝试使用Express错误路由
      next(err);
    } catch(err){
      //如果Express错误路由失效，尝试返回普通文本响应
      console.error('Express error mechanism failed./n', err.stack);
      res.statusCode = 500;
      res.setHeader('content-type', 'text/plain');
      res.end('Server error.');
    }
  }catch(err){
    console.error('Unable to send 500 response. \n', err.stack);
  }
  //向域中添加请求和响应对象
  domain.add(req);
  domain.add(res);
  //执行该域中剩余的请求链
  domain.run(next);
})

app.use(function(err,req,res,next){
  console.log('检测到未处理错误：'+ err.message);
  res.send('500 - 服务器错误');
});

app.use(function(req,res){
  console.log('未处理的路由');
  res.send('404 - 未找到');
});

var server =   http.createServer(app).listen(app.get('port'),function(){
  console.log('Express started in ' + app.get('env') 
  + ' mode on http://localhost:' + app.get('port'))
  + '; press Ctrl-C to terminate.';
})
function startServer(){
  server;
}

if(require.main === module) {
  //应用程序直接运行；启动应用服务器
  startServer();
} else {
  //应用程序作为一个模块 通过“require” 引入：导出函数
  //创建服务器
  module.exports = startServer;
}

